
package com.szrt.huanghoulin.student.dao.impl;

import java.io.IOException;
import java.io.Reader;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.szrt.huanghoulin.student.dao.StudentDao;
import com.szrt.huanghoulin.student.entity.StudentEntity;

public class StudentDaoImpl implements StudentDao {

	//因为配置文件都是一样的。只需要读1次就行
	private static SqlSessionFactory factory;
	
	//静态代码块 在所有的方法之前就执行 也就是说在执行add这个方法之前就执行 静态代码块中的代码
	static{
		
		Reader reader;
		try {
			
			//读取mybatis的配置文件
			reader = Resources.getResourceAsReader("mybatis.xml");
			//通过工厂模式 Connection
			factory = new SqlSessionFactoryBuilder().build(reader);
			System.out.println("SqlSessionFactory初始化成功...." + factory);
		} catch (IOException e) {
			System.out.println("配置文件mybatis.xml有误....");
			e.printStackTrace();
		}
		
		
	}
	
	
	/**
	 * 增加Override注解  可以保证你的方法的申明没有写错
	 */
	
	@Override
	public int add(StudentEntity entity) {
		//1 拿到连接
		SqlSession session = factory.openSession();
		//2执行SQL
		
		String sql="com.szrt.huanghoulin.student.dao.StudentDao.add";
		int counter = session.insert(sql, entity);
		
		//获得刚刚插入的那条记录的id 特别是在1对多的情况下用
		
		System.out.println("id="+entity.getId());
		
		
		//3提交事务
		session.commit();
		
		//4关闭连接
		session.close();
		return counter;
	}


	@Override
	public StudentEntity findById(int id) {
		//1 拿到连接 true表示自动提交事务
		SqlSession session = factory.openSession(true);
		//2执行SQL
		
		String sql="com.szrt.huanghoulin.student.dao.StudentDao.findById";
		StudentEntity entity = session.selectOne(sql, id);
		
		//4关闭连接
		session.close();
		return entity;
	}


	@Override
	public int deleteById(int id) {
		//1 拿到连接 true表示自动提交事务
		SqlSession session = factory.openSession(true);
		//2执行SQL
		String sql="com.szrt.huanghoulin.student.dao.StudentDao.deleteById";
		int counter = session.delete(sql, id);
		System.out.println("counter="+counter);
		
		//4关闭连接
		session.close();
		return counter;
	}


	@Override
	public int update(StudentEntity entity) {
		//1 拿到连接 true表示自动提交事务
		SqlSession session = factory.openSession(true);
		//2执行SQL
		String sql="com.szrt.huanghoulin.student.dao.StudentDao.update";
		int counter = session.update(sql, entity);
		System.out.println("counter="+counter);
		//4关闭连接
		session.close();
		return counter;
	}


	@Override
	public int deleteByIdsByArray(int[] ids) {
		
		//1 拿到连接 true表示自动提交事务
		SqlSession session = factory.openSession(true);
		//2执行SQL
		String sql="com.szrt.huanghoulin.student.dao.StudentDao.deleteByIdsByArray";
		int counter = session.delete(sql, ids);
		System.out.println("counter="+counter);
		
		//4关闭连接
		session.close();
		return counter;
	}
	
	@Override
	public int deleteByIdsByList(List<Object> ids) {
		//1 拿到连接 true表示自动提交事务
		SqlSession session = factory.openSession(true);
		//2执行SQL
		String sql="com.szrt.huanghoulin.student.dao.StudentDao.deleteByIdsByList";
		int counter = session.delete(sql, ids);
		System.out.println("counter="+counter);
		
		//4关闭连接
		session.close();
		return counter;
	}


	@Override
	public List<StudentEntity> findAll() {
		
		//1 拿到连接 true表示自动提交事务
		SqlSession session = factory.openSession(true);
		//2执行SQL
		
		String sql="com.szrt.huanghoulin.student.dao.StudentDao.findAll";
		List<StudentEntity> list = session.selectList(sql);
		
		//4关闭连接
		session.close();
		return list;
	}




}
